/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pr3.cromosoma;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
import pr3.funcion.Funcion;

/**
 *
 * @author Gonzalo Ortiz Jaureguizar (gortiz at software.imdea.org)
 */
public class CromosomaIterator implements Iterator<Funcion> {

    LinkedList<Funcion> pendientes;
    Funcion lastReturned = null;
    final int profMax;
    
    public CromosomaIterator(CromosomaArbol f, int profMax) {
        pendientes = new LinkedList<Funcion>();
        pendientes.add(f.getRaiz());
        this.profMax = profMax;
    }
    
    public CromosomaIterator(CromosomaArbol f) {
        this(f, Integer.MAX_VALUE);
    }
    
    @Override
    public boolean hasNext() {
        return !pendientes.isEmpty();
    }

    @Override
    public Funcion next() {
        lastReturned = pendientes.removeLast();
        
        if(lastReturned.getProfundidad() < profMax) {
            for(int i = 0; i < lastReturned.getAridad(); i++) {
                pendientes.addLast(lastReturned.getArgumento(i));
            }
        }
        
        return lastReturned;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("Operacion no soportada.");
    }
    
    public void ignorar(Funcion f) {
        if(pendientes.isEmpty())
            return ;
        ListIterator<Funcion> it = pendientes.listIterator(pendientes.size() - 1);
        while(it.hasPrevious()) {
            if(it.previous() == f) {
                it.remove();
                break;
            }
        }
    }
}
